/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mx.unam.fciencias.ActividadesCulturales.pages.Admin;

import java.util.Date;
import mx.unam.fciencias.ActividadesCulturales.commons.Util;
import mx.unam.fciencias.ActividadesCulturales.pages.Index;
import mx.unam.fciencias.ActividadesCulturales.services.ServicioUsuario;
import mx.unam.fciencias.actividadesculturales.entidades.portal.Permiso;
import mx.unam.fciencias.actividadesculturales.entidades.portal.UsuarioSistema;
import mx.unam.fciencias.actividadesculturales.entidades.portal.enums.TipoPermiso;
import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.Service;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.ioc.annotations.Inject;

/**
 * Página para el registro de usuarios en el sistema.
 * @author lumartin
 */
public class RegistroUsuario {

    /** Usuario del sistema. */
    @Property
    private UsuarioSistema newUsuario;
    /** Inyección de srvicio utilizado para el acceso a datos de usuario. */
    @Inject
    @Service("servicioUsuario")
    private ServicioUsuario servicioUsuario;
    /** Propiedad para la primer clave tecleada. */
    @Property
    private String passwd1;
    /** Propiedad para la segunda clave tecleada. */
    @Property
    private String passwd2;
    /** Propiedad de lectura */
    private boolean lectura;
    /** Propiedad de escritura */
    private boolean escritura;
    /** Formulario para el registro de usuarios. */
    @InjectComponent
    private Form registro;
    /** Mensaje para mostrarle al usuario si el registro fue exitoso. */
    @Property
    private String mensajeOK;

    /**
     * Método que valida el formulario.
     */
    @OnEvent(value = EventConstants.VALIDATE_FORM)
    public void valida() {
        if (!passwd1.equals(passwd2)) {
            registro.recordError("Las contraseñas no coinciden");
        }
        if (servicioUsuario.buscaEmail(newUsuario.getEmail()) != null) {
            registro.recordError("Correo electrónico existente.");
        }
        if (servicioUsuario.buscaUsername(newUsuario.getUsername()) != null) {
            registro.recordError("Nombre de usuario existente.");
        }
    }

    /**
     * Método que se ejecuta despúes de valida() y guarda el nuevo usuario.
     * @return la página a redireccionar.
     */
    Object onSuccess() {
        newUsuario.setPasswd(passwd1);
        Permiso lecturaP = new Permiso();
        Permiso escrituraP = new Permiso();

        if (newUsuario.esAdministrador()) {
            escritura = true;
        }

        if (escritura) {
            lecturaP.setPermiso(TipoPermiso.CONSULTAR);
            lecturaP.setUsuario(newUsuario);
            escrituraP.setPermiso(TipoPermiso.AGREGAR);
            escrituraP.setUsuario(newUsuario);
            newUsuario.getPermisos().add(lecturaP);
            newUsuario.getPermisos().add(escrituraP);

        } else if (!escritura && lectura) {
            lecturaP.setPermiso(TipoPermiso.CONSULTAR);
            lecturaP.setUsuario(newUsuario);
            newUsuario.getPermisos().add(lecturaP);
        }
        newUsuario.setPasswd(Util.getMD5(passwd1));
        newUsuario.setFechaAlta(new Date());
        newUsuario.setUsuarioActivo(true);
        servicioUsuario.guarda(newUsuario);
        mensajeOK = "Usuario agregado.";
        return Index.class;
    }
        
}
